import os
import pymysql
from datetime import datetime, timedelta
import random
from dotenv import load_dotenv

# 加载环境变量
load_dotenv()

# 远程MySQL数据库连接配置 - 使用环境变量
REMOTE_DB_CONFIG = {
    'host': os.environ.get('DB_HOST', 'localhost'),
    'user': os.environ.get('DB_USER', 'root'),
    'password': os.environ.get('DB_PASSWORD'),
    'database': os.environ.get('DB_NAME', 'basal_adjust'),
    'cursorclass': pymysql.cursors.DictCursor # 使用字典游标方便处理查询结果
}

def generate_cgm_data(start_datetime, num_points=288, interval_minutes=5, base_sgv=120, fluctuation_intensity=1.0):
    """
    生成模拟CGM数据序列。

    Args:
        start_datetime (datetime): 数据开始的时间戳。
        num_points (int): 要生成的数据点数量。
        interval_minutes (int): 数据点之间的时间间隔（分钟）。
        base_sgv (int): 基础血糖平均值。
        fluctuation_intensity (float): 波动强度因子，影响血糖变化幅度。

    Returns:
        list: [(timestamp, sgv), ...] 格式的CGM数据列表。
    """
    data = []
    current_time = start_datetime
    sgv = base_sgv
    
    for i in range(num_points):
        # 随机波动，模拟正常的血糖变化
        fluctuation = random.uniform(-10, 10) * fluctuation_intensity
        sgv += fluctuation
        
        # 保持血糖在合理范围内 (50-400 mg/dL)
        sgv = max(50, min(400, sgv))
        
        # 添加时间点和血糖值
        data.append((current_time, round(sgv, 1)))
        
        # 时间递增
        current_time += timedelta(minutes=interval_minutes)
    
    return data

def create_cgm_table(patient_number):
    """
    为指定患者创建CGM数据表。
    
    Args:
        patient_number (str): 患者编号。
    """
    try:
        # 检查数据库密码是否配置
        if not REMOTE_DB_CONFIG['password']:
            print("错误：数据库密码未配置。请在.env文件中设置DB_PASSWORD")
            return False
            
        connection = pymysql.connect(**REMOTE_DB_CONFIG)
        cursor = connection.cursor()
        
        table_name = f"cgm_{patient_number}"
        
        # 创建表的SQL语句
        create_table_sql = f"""
        CREATE TABLE IF NOT EXISTS `{table_name}` (
            id INT AUTO_INCREMENT PRIMARY KEY,
            sg_date DATETIME NOT NULL,
            sgv FLOAT NOT NULL,
            created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
            INDEX idx_sg_date (sg_date)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
        """
        
        cursor.execute(create_table_sql)
        connection.commit()
        print(f"表 {table_name} 创建成功")
        
        cursor.close()
        connection.close()
        return True
        
    except Exception as e:
        print(f"创建表失败: {e}")
        return False

def insert_cgm_data(patient_number, cgm_data):
    """
    将CGM数据插入到数据库中。
    
    Args:
        patient_number (str): 患者编号。
        cgm_data (list): CGM数据列表。
    """
    try:
        # 检查数据库密码是否配置
        if not REMOTE_DB_CONFIG['password']:
            print("错误：数据库密码未配置。请在.env文件中设置DB_PASSWORD")
            return
            
        connection = pymysql.connect(**REMOTE_DB_CONFIG)
        cursor = connection.cursor()
        
        table_name = f"cgm_{patient_number}"
        
        # 批量插入数据
        insert_sql = f"INSERT INTO `{table_name}` (sg_date, sgv) VALUES (%s, %s)"
        cursor.executemany(insert_sql, cgm_data)
        
        connection.commit()
        print(f"成功插入 {len(cgm_data)} 条CGM数据到表 {table_name}")
        
        cursor.close()
        connection.close()
        
    except Exception as e:
        print(f"插入数据失败: {e}")

def simulate_daily_cgm_data(patient_number, target_date=None):
    """
    为指定患者生成一天的模拟CGM数据。
    
    Args:
        patient_number (str): 患者编号。
        target_date (str, optional): 目标日期，格式为'YYYY-MM-DD'。如果不指定，使用当前日期。
    """
    # 检查环境变量配置
    if not REMOTE_DB_CONFIG['password']:
        print("错误：数据库密码未配置")
        print("请执行以下步骤：")
        print("1. 复制 env.example 为 .env")
        print("2. 在 .env 文件中设置 DB_PASSWORD=你的数据库密码")
        return
    
    if target_date is None:
        target_date = datetime.now().strftime('%Y-%m-%d')
    
    # 设置开始时间为目标日期的00:00:00
    start_datetime = datetime.strptime(f"{target_date} 00:00:00", '%Y-%m-%d %H:%M:%S')
    
    print(f"正在为患者 {patient_number} 生成 {target_date} 的模拟CGM数据...")
    
    # 创建表
    if not create_cgm_table(patient_number):
        return
    
    # 生成一天的数据 (24小时 * 12个数据点/小时 = 288个数据点)
    cgm_data = generate_cgm_data(
        start_datetime=start_datetime,
        num_points=288,
        interval_minutes=5,
        base_sgv=120,
        fluctuation_intensity=1.0
    )
    
    # 插入数据
    insert_cgm_data(patient_number, cgm_data)
    
    print(f"患者 {patient_number} 的CGM数据生成完成")

def main():
    """主函数"""
    print("CGM数据模拟器")
    print("================")
    
    # 默认患者编号
    patient_number = os.environ.get('TEST_PATIENT_NUMBER', 'test001')
    
    # 生成今天的数据
    simulate_daily_cgm_data(patient_number)
    
    # 也可以生成指定日期的数据
    # simulate_daily_cgm_data(patient_number, '2025-01-20')

if __name__ == "__main__":
    main() 